In the previous practical we went through all the functions and saved our complete myCAGEset with all the analysis slots. In this (short) part, we will export data from this object for use in downstream quality control, manipulation, and visualization.

Summary and goals of this practical


CAGEr Export

2.1 Loading in myCAGE object

Let’s not forget the packages for good practice:

require(CAGEr)
package ‘S4Vectors’ was built under R version 3.3.2package ‘GenomeInfoDb’ was built under R version 3.3.2package ‘GenomicRanges’ was built under R version 3.3.2package ‘Biostrings’ was built under R version 3.3.2
load("../Data/intermediate/CAGEobject_twoSamples_PowNom_allSlots.RData")

Everything still in the slots and do we have the right samples? What is the genome build?

myCAGEset

2.2 CTSS visualization in genome browser


Make a bedgraph file

CAGEr can create bedGraph files with tracks of CAGE signal. It will give you two sets of tracks per sample: one of the plus strand and one for the minus strand. The function is exportCTSStoBedGraph() where we can specify if we want the normalized or raw tag counts. It needs:

  • object
  • values - “raw” or “normalized”
  • format - “BigWig” or “bedGraph”
  • oneFile - TRUE or FALSE to be exported in the same file (for bedGraph)

Let’s export then the normalized tag counts for both our samples in one file:

exportCTSStoBedGraph(myCAGEset,
                     values = "normalized",
                     format = "bedGraph",
                     oneFile = TRUE)

This is one file with each of the samples concatenated. Each will start with the track name= line for the genome browser, followed by the bed coordinates and the normalized tag count values for the height of the bar.


View in UCSC Genome browser as custom track

We will all look at the same location first. Please open the bedGraph file in a text editor of your choice and add a few lines (copy from below).

Top of the file: browser position chr21:5819775-5819875 followed by a line break. This will specify the 100 bp postiion on chromosome 21.

At the end of each trackname the following in this order. This will specify that the values should always start at zero, the data should be autoscaled, and the colour for easy viewing.

alwaysZero=on autoScale=on color=19,4,142
alwaysZero=on autoScale=on color=19,4,142
alwaysZero=on autoScale=on color=144,12,63
alwaysZero=on autoScale=on color=144,12,63

Example, for the first track name visible in the file it should now look like this:

browser position chr21:5819775-5819875
track name=zf_512cells_normalized_plus description="zf_512cells CTSS normalized (plus strand)" visibility=full type=bedGraph alwaysZero=on autoScale=on color=19,4,142
chr1    16925   16926   0.166938978924912
chr1    50283   50284   0.166938978924912

Now go to the UCSC Genome Browser.

  • Select our genome build, Jul. 2010 (Zv9/danRer7), and click GO
  • At the blue tabs bar; go to MyData and select Custom Tracks
  • Click add custom tracks
  • In the first box choose your file with the Browse button
  • Click on submit
  • Click on go and view in genome browser

Great! We now are looking at a region in chr21 and should look like shown below. On which strand do we see the signals?

Genome browser picture

Genome browser picture

Please note that because we set it to autoscale, the bars of both samples may seem evenly expressed but that is not true. The sample in blue goes up to value 10.3 whilst the sample in red to 31.2. To give a better picture of what’s happening here, you can set both to vertical viewing range and choose a max value (here maybe 35).


2.3 Promoter width visualization in genome browser


Make the bed file

The interquantile width per TC that we determined earlier (between 0.1 and 0.9) can also be visualized in the genome browser as a gene-like representation. For this, we are exporting it in a bed file format by using exportToBed()

exportToBed(object = myCAGEset, 
            what = "tagClusters",
            qLow = 0.1, 
            qUp = 0.9, 
            oneFile = TRUE)


View in UCSC Genome browser as custom track

Similar to above, we will all look at the same location again. Please open the bed file in a text editor of your choice and add the few lines (copy from below).

Top of the file: browser position chr21:5819775-5819875 followed by a line break. This will specify the 100 bp postiion on chromosome 21.

At the end of each trackname the following in this order. This will colour the samples in the same colours.

alwaysZero=on autoScale=on color=19,4,142
alwaysZero=on autoScale=on color=144,12,63

Now revisit the UCSC Genome Browser.

  • At the blue tabs bar; go to MyData and select Custom Tracks
  • Click add custom tracks
  • In the first box choose your file with the Browse button
  • Click on submit
  • Click on go and view in genome browser

As you can see from the custom tracks, the pevious bedGraphs are still there and we have added the TC widths for each samples.

Genome browser picture TCs added

Genome browser picture TCs added

The bars are adjusted to a max value of 35 for the CTSS. Can you see the difference?


A note on consensus clusters

The genome browser picture showing both the TCs and CTSSs highlights something to keep in mind about consensus clusters. The distribution of CTSS that form the TC in prim6 overlap two seperate TCs in the 512 cell stage.

2.4 Empty R environment

rm(list = ls() )

Session Info

R version 3.3.1 (2016-06-21)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.6 (El Capitan)

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods  
[9] base     

other attached packages:
 [1] CAGEr_1.16.0         BSgenome_1.42.0      rtracklayer_1.34.1   Biostrings_2.42.1   
 [5] XVector_0.14.0       GenomicRanges_1.26.2 GenomeInfoDb_1.10.2  IRanges_2.8.1       
 [9] S4Vectors_0.12.1     BiocGenerics_0.20.0 

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.8                knitr_1.15.1               magrittr_1.5              
 [4] splines_3.3.1              GenomicAlignments_1.10.0   zlibbioc_1.20.0           
 [7] beanplot_1.2               BiocParallel_1.8.1         som_0.3-5.1               
[10] lattice_0.20-34            stringr_1.1.0              tools_3.3.1               
[13] grid_3.3.1                 SummarizedExperiment_1.4.0 data.table_1.10.0         
[16] Biobase_2.34.0             htmltools_0.3.5            yaml_2.1.14               
[19] rprojroot_1.1              digest_0.6.11              Matrix_1.2-7.1            
[22] base64enc_0.1-3            bitops_1.0-6               RCurl_1.95-4.8            
[25] VGAM_1.0-2                 evaluate_0.10              rmarkdown_1.3             
[28] stringi_1.1.2              backports_1.0.4            Rsamtools_1.26.1          
[31] XML_3.98-1.5               jsonlite_1.2              
LS0tCnRpdGxlOiAiMi4gVmlzdWFsaXphdGlvbiBpbiBHZW5vbWUgQnJvd3NlciAoVUNTQykiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgZGZfcHJpbnQ6IHBhZ2VkCgotLS0KPGJyPgpJbiB0aGUgcHJldmlvdXMgcHJhY3RpY2FsIHdlIHdlbnQgdGhyb3VnaCBhbGwgdGhlIGZ1bmN0aW9ucyBhbmQgc2F2ZWQgb3VyIGNvbXBsZXRlIG15Q0FHRXNldCB3aXRoIGFsbCB0aGUgYW5hbHlzaXMgc2xvdHMuIEluIHRoaXMgKHNob3J0KSBwYXJ0LCB3ZSB3aWxsIGV4cG9ydCBkYXRhIGZyb20gdGhpcyBvYmplY3QgZm9yIHVzZSBpbiBkb3duc3RyZWFtIHF1YWxpdHkgY29udHJvbCwgbWFuaXB1bGF0aW9uLCBhbmQgdmlzdWFsaXphdGlvbi4gCgojIyBTdW1tYXJ5IGFuZCBnb2FscyBvZiB0aGlzIHByYWN0aWNhbAo8YnI+Cl9DQUdFciBFeHBvcnRfCgoqIENUU1MgYXMgYmVkR3JhcGggaW4gZ2Vub21lIGJyb3dzZXIKKiBQcm9tb3RlciB3aWR0aCBhcyBiZWQgZmlsZSBhbmQgdmlzdWFsaXplICB0aGlzIGluIGdlbm9tZSBicm93c2VyCgojIyAyLjEgTG9hZGluZyBpbiBteUNBR0Ugb2JqZWN0CkxldCdzIG5vdCBmb3JnZXQgdGhlIHBhY2thZ2VzIGZvciBnb29kIHByYWN0aWNlOgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KcmVxdWlyZShDQUdFcikKbG9hZCgiLi4vRGF0YS9pbnRlcm1lZGlhdGUvQ0FHRW9iamVjdF90d29TYW1wbGVzX1Bvd05vbV9hbGxTbG90cy5SRGF0YSIpCmBgYApFdmVyeXRoaW5nIHN0aWxsIGluIHRoZSBzbG90cyBhbmQgZG8gd2UgaGF2ZSB0aGUgcmlnaHQgc2FtcGxlcz8gV2hhdCBpcyB0aGUgZ2Vub21lIGJ1aWxkPwpgYGB7ciwgZXZhbD1GQUxTRX0KbXlDQUdFc2V0CmBgYAoKCiMjIDIuMiBDVFNTIHZpc3VhbGl6YXRpb24gaW4gZ2Vub21lIGJyb3dzZXIKPGJyPgoKIyMjIyBNYWtlIGEgYmVkZ3JhcGggZmlsZQpfQ0FHRXJfIGNhbiBjcmVhdGUgYmVkR3JhcGggZmlsZXMgd2l0aCB0cmFja3Mgb2YgQ0FHRSBzaWduYWwuIEl0IHdpbGwgZ2l2ZSB5b3UgdHdvIHNldHMgb2YgdHJhY2tzIF9wZXIgc2FtcGxlXzogb25lIG9mIHRoZSBwbHVzIHN0cmFuZCBhbmQgb25lIGZvciB0aGUgbWludXMgc3RyYW5kLiBUaGUgZnVuY3Rpb24gaXMgYGV4cG9ydENUU1N0b0JlZEdyYXBoKClgIHdoZXJlIHdlIGNhbiBzcGVjaWZ5IGlmIHdlIHdhbnQgdGhlIG5vcm1hbGl6ZWQgb3IgcmF3IHRhZyBjb3VudHMuIApJdCBuZWVkczoKCiogYG9iamVjdGAgCiogYHZhbHVlc2AgLSAicmF3IiBvciAibm9ybWFsaXplZCIKKiBgZm9ybWF0YCAtICJCaWdXaWciIG9yICJiZWRHcmFwaCIKKiBgb25lRmlsZWAgLSBUUlVFIG9yIEZBTFNFIHRvIGJlIGV4cG9ydGVkIGluIHRoZSBzYW1lIGZpbGUgKGZvciBiZWRHcmFwaCkgCgpMZXQncyBleHBvcnQgdGhlbiB0aGUgbm9ybWFsaXplZCB0YWcgY291bnRzIGZvciBib3RoIG91ciBzYW1wbGVzIGluIG9uZSBmaWxlOgoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmV4cG9ydENUU1N0b0JlZEdyYXBoKG15Q0FHRXNldCwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gIm5vcm1hbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiYmVkR3JhcGgiLAogICAgICAgICAgICAgICAgICAgICBvbmVGaWxlID0gVFJVRSkKYGBgCgpUaGlzIGlzIG9uZSBmaWxlIHdpdGggZWFjaCBvZiB0aGUgc2FtcGxlcyBjb25jYXRlbmF0ZWQuIEVhY2ggd2lsbCBzdGFydCB3aXRoIHRoZSBgdHJhY2sgbmFtZT1gIGxpbmUgZm9yIHRoZSBnZW5vbWUgYnJvd3NlciwgZm9sbG93ZWQgYnkgdGhlIGJlZCBjb29yZGluYXRlcyBhbmQgdGhlIG5vcm1hbGl6ZWQgdGFnIGNvdW50IHZhbHVlcyBmb3IgdGhlIGhlaWdodCBvZiB0aGUgYmFyLiAKCjxicj4gCgojIyMjIFZpZXcgaW4gVUNTQyBHZW5vbWUgYnJvd3NlciBhcyBjdXN0b20gdHJhY2sKV2Ugd2lsbCBhbGwgbG9vayBhdCB0aGUgc2FtZSBsb2NhdGlvbiBmaXJzdC4gUGxlYXNlIG9wZW4gdGhlIGJlZEdyYXBoIGZpbGUgaW4gYSB0ZXh0IGVkaXRvciBvZiB5b3VyIGNob2ljZSBhbmQgYWRkIGEgZmV3IGxpbmVzIChjb3B5IGZyb20gYmVsb3cpLgoKVG9wIG9mIHRoZSBmaWxlOiAKYGJyb3dzZXIgcG9zaXRpb24gY2hyMjE6NTgxOTc3NS01ODE5ODc1YCBmb2xsb3dlZCBieSBhIGxpbmUgYnJlYWsuIFRoaXMgd2lsbCBzcGVjaWZ5IHRoZSAxMDAgYnAgcG9zdGlpb24gb24gY2hyb21vc29tZSAyMS4KCkF0IHRoZSBlbmQgb2YgZWFjaCB0cmFja25hbWUgdGhlIGZvbGxvd2luZyBpbiB0aGlzIG9yZGVyLiBUaGlzIHdpbGwgc3BlY2lmeSB0aGF0IHRoZSB2YWx1ZXMgc2hvdWxkIGFsd2F5cyBzdGFydCBhdCB6ZXJvLCB0aGUgZGF0YSBzaG91bGQgYmUgYXV0b3NjYWxlZCwgYW5kIHRoZSBjb2xvdXIgZm9yIGVhc3kgdmlld2luZy4KCmBhbHdheXNaZXJvPW9uIGF1dG9TY2FsZT1vbiBjb2xvcj0xOSw0LDE0MmAgPGJyPgpgYWx3YXlzWmVybz1vbiBhdXRvU2NhbGU9b24gY29sb3I9MTksNCwxNDJgIDxicj4KYGFsd2F5c1plcm89b24gYXV0b1NjYWxlPW9uIGNvbG9yPTE0NCwxMiw2M2AgPGJyPgpgYWx3YXlzWmVybz1vbiBhdXRvU2NhbGU9b24gY29sb3I9MTQ0LDEyLDYzYCA8YnI+CgpFeGFtcGxlLCBmb3IgdGhlIGZpcnN0IHRyYWNrIG5hbWUgdmlzaWJsZSBpbiB0aGUgZmlsZSBpdCBzaG91bGQgbm93IGxvb2sgbGlrZSB0aGlzOgoKYGBge2Jhc2gsIGV2YWw9RkFMU0V9CmJyb3dzZXIgcG9zaXRpb24gY2hyMjE6NTgxOTc3NS01ODE5ODc1CnRyYWNrIG5hbWU9emZfNTEyY2VsbHNfbm9ybWFsaXplZF9wbHVzIGRlc2NyaXB0aW9uPSJ6Zl81MTJjZWxscyBDVFNTIG5vcm1hbGl6ZWQgKHBsdXMgc3RyYW5kKSIgdmlzaWJpbGl0eT1mdWxsIHR5cGU9YmVkR3JhcGggYWx3YXlzWmVybz1vbiBhdXRvU2NhbGU9b24gY29sb3I9MTksNCwxNDIKY2hyMQkxNjkyNQkxNjkyNgkwLjE2NjkzODk3ODkyNDkxMgpjaHIxCTUwMjgzCTUwMjg0CTAuMTY2OTM4OTc4OTI0OTEyCmBgYAoKTm93IGdvIHRvIHRoZSBbVUNTQyBHZW5vbWUgQnJvd3Nlcl0oaHR0cHM6Ly9nZW5vbWUtZXVyby51Y3NjLmVkdS9jZ2ktYmluL2hnR2F0ZXdheT9oZ3NpZD0yMTk2MjgyOThfcjhzRFQzWmtCMlZaTFY0bHVvRzlQN3pyMGhuYykuIDxicj4KCi0gU2VsZWN0IG91ciBnZW5vbWUgYnVpbGQsICBfX0p1bC4gMjAxMCAoWnY5L2RhblJlcjcpX18sIGFuZCBjbGljayBfR09fCi0gQXQgdGhlIGJsdWUgdGFicyBiYXI7IGdvIHRvIF9NeURhdGFfIGFuZCBzZWxlY3QgX0N1c3RvbSBUcmFja3NfCi0gQ2xpY2sgX2FkZCBjdXN0b20gdHJhY2tzXwotIEluIHRoZSBmaXJzdCBib3ggY2hvb3NlIHlvdXIgZmlsZSB3aXRoIHRoZSBfQnJvd3NlXyBidXR0b24KLSBDbGljayBvbiBfc3VibWl0XwotIENsaWNrIG9uIF9nb18gYW5kIHZpZXcgaW4gZ2Vub21lIGJyb3dzZXIKCkdyZWF0ISBXZSBub3cgYXJlIGxvb2tpbmcgYXQgYSByZWdpb24gaW4gY2hyMjEgYW5kIHNob3VsZCBsb29rIGxpa2Ugc2hvd24gYmVsb3cuIE9uIHdoaWNoIHN0cmFuZCBkbyB3ZSBzZWUgdGhlIHNpZ25hbHM/CgohW0dlbm9tZSBicm93c2VyIHBpY3R1cmVdKC4uL2ltYWdlcy91Y3NjX2NhcHR1cmVfMlNhbXBsZXMucG5nKQoKPiBQbGVhc2Ugbm90ZSB0aGF0IGJlY2F1c2Ugd2Ugc2V0IGl0IHRvIGF1dG9zY2FsZSwgdGhlIGJhcnMgb2YgYm90aCBzYW1wbGVzIG1heSBzZWVtIGV2ZW5seSBleHByZXNzZWQgYnV0IHRoYXQgaXMgbm90IHRydWUuIFRoZSBzYW1wbGUgaW4gYmx1ZSBnb2VzIHVwIHRvIHZhbHVlIDEwLjMgd2hpbHN0IHRoZSBzYW1wbGUgaW4gcmVkIHRvIDMxLjIuIFRvIGdpdmUgYSBiZXR0ZXIgcGljdHVyZSBvZiB3aGF0J3MgaGFwcGVuaW5nIGhlcmUsIHlvdSBjYW4gc2V0IGJvdGggdG8gX19fdmVydGljYWwgdmlld2luZyByYW5nZV9fXyBhbmQgY2hvb3NlIGEgX19fbWF4IHZhbHVlX19fIChoZXJlIG1heWJlIDM1KS4gCgo8YnI+CgojIyMgMi4zIFByb21vdGVyIHdpZHRoIHZpc3VhbGl6YXRpb24gaW4gZ2Vub21lIGJyb3dzZXIKPGJyPiAKCiMjIyMgTWFrZSB0aGUgYmVkIGZpbGUKVGhlIGludGVycXVhbnRpbGUgd2lkdGggcGVyIFRDIHRoYXQgd2UgZGV0ZXJtaW5lZCBlYXJsaWVyIChiZXR3ZWVuIDAuMSBhbmQgMC45KSBjYW4gYWxzbyBiZSB2aXN1YWxpemVkIGluIHRoZSBnZW5vbWUgYnJvd3NlciBhcyBhIGdlbmUtbGlrZSByZXByZXNlbnRhdGlvbi4gRm9yIHRoaXMsIHdlIGFyZSBleHBvcnRpbmcgaXQgaW4gYSBiZWQgZmlsZSBmb3JtYXQgYnkgdXNpbmcgYGV4cG9ydFRvQmVkKClgCgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KZXhwb3J0VG9CZWQob2JqZWN0ID0gbXlDQUdFc2V0LCAKICAgICAgICAgICAgd2hhdCA9ICJ0YWdDbHVzdGVycyIsCiAgICAgICAgICAgIHFMb3cgPSAwLjEsIAogICAgICAgICAgICBxVXAgPSAwLjksIAogICAgICAgICAgICBvbmVGaWxlID0gVFJVRSkKYGBgCgo8YnI+CgojIyMjIFZpZXcgaW4gVUNTQyBHZW5vbWUgYnJvd3NlciBhcyBjdXN0b20gdHJhY2sKU2ltaWxhciB0byBhYm92ZSwgd2Ugd2lsbCBhbGwgbG9vayBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhZ2Fpbi4gUGxlYXNlIG9wZW4gdGhlIGJlZCBmaWxlIGluIGEgdGV4dCBlZGl0b3Igb2YgeW91ciBjaG9pY2UgYW5kIGFkZCB0aGUgZmV3IGxpbmVzIChjb3B5IGZyb20gYmVsb3cpLgoKVG9wIG9mIHRoZSBmaWxlOiAKYGJyb3dzZXIgcG9zaXRpb24gY2hyMjE6NTgxOTc3NS01ODE5ODc1YCBmb2xsb3dlZCBieSBhIGxpbmUgYnJlYWsuIFRoaXMgd2lsbCBzcGVjaWZ5IHRoZSAxMDAgYnAgcG9zdGlpb24gb24gY2hyb21vc29tZSAyMS4KCkF0IHRoZSBlbmQgb2YgZWFjaCB0cmFja25hbWUgdGhlIGZvbGxvd2luZyBpbiB0aGlzIG9yZGVyLiBUaGlzIHdpbGwgY29sb3VyIHRoZSBzYW1wbGVzIGluIHRoZSBzYW1lIGNvbG91cnMuCgpgYWx3YXlzWmVybz1vbiBhdXRvU2NhbGU9b24gY29sb3I9MTksNCwxNDJgIDxicj4KYGFsd2F5c1plcm89b24gYXV0b1NjYWxlPW9uIGNvbG9yPTE0NCwxMiw2M2AgPGJyPgoKCk5vdyByZXZpc2l0IHRoZSBbVUNTQyBHZW5vbWUgQnJvd3Nlcl0oaHR0cHM6Ly9nZW5vbWUtZXVyby51Y3NjLmVkdS9jZ2ktYmluL2hnR2F0ZXdheT9oZ3NpZD0yMTk2MjgyOThfcjhzRFQzWmtCMlZaTFY0bHVvRzlQN3pyMGhuYykuIDxicj4KCi0gQXQgdGhlIGJsdWUgdGFicyBiYXI7IGdvIHRvIF9NeURhdGFfIGFuZCBzZWxlY3QgX0N1c3RvbSBUcmFja3NfCi0gQ2xpY2sgX2FkZCBjdXN0b20gdHJhY2tzXwotIEluIHRoZSBmaXJzdCBib3ggY2hvb3NlIHlvdXIgZmlsZSB3aXRoIHRoZSBfQnJvd3NlXyBidXR0b24KLSBDbGljayBvbiBfc3VibWl0XwotIENsaWNrIG9uIF9nb18gYW5kIHZpZXcgaW4gZ2Vub21lIGJyb3dzZXIKCkFzIHlvdSBjYW4gc2VlIGZyb20gdGhlIGN1c3RvbSB0cmFja3MsIHRoZSBwZXZpb3VzIGJlZEdyYXBocyBhcmUgc3RpbGwgdGhlcmUgYW5kIHdlIGhhdmUgYWRkZWQgdGhlIFRDIHdpZHRocyBmb3IgZWFjaCBzYW1wbGVzLiAKCiFbR2Vub21lIGJyb3dzZXIgcGljdHVyZSBUQ3MgYWRkZWRdKC4uL2ltYWdlcy91Y3NjX2NhcHR1cmVfVEN3aWR0aC5wbmcpCgo+IFRoZSBiYXJzIGFyZSBhZGp1c3RlZCB0byBhIG1heCB2YWx1ZSBvZiAzNSBmb3IgdGhlIENUU1MuIENhbiB5b3Ugc2VlIHRoZSBkaWZmZXJlbmNlPwoKPGJyPgoKIyMjIyBBIG5vdGUgb24gY29uc2Vuc3VzIGNsdXN0ZXJzClRoZSBnZW5vbWUgYnJvd3NlciBwaWN0dXJlIHNob3dpbmcgYm90aCB0aGUgVENzIGFuZCBDVFNTcyBoaWdobGlnaHRzIHNvbWV0aGluZyB0byBrZWVwIGluIG1pbmQgYWJvdXQgY29uc2Vuc3VzIGNsdXN0ZXJzLiBUaGUgZGlzdHJpYnV0aW9uIG9mIENUU1MgdGhhdCBmb3JtIHRoZSBUQyBpbiBwcmltNiBvdmVybGFwIHR3byBzZXBlcmF0ZSBUQ3MgaW4gdGhlIDUxMiBjZWxsIHN0YWdlLgoKIyAyLjQgRW1wdHkgUiBlbnZpcm9ubWVudApgYGB7cn0Kcm0obGlzdCA9IGxzKCkgKQpgYGAKCgojIFNlc3Npb24gSW5mbwpgYGB7ciwgZWNobz1GQUxTRX0Kc2Vzc2lvbkluZm8oKQpgYGAK